/* -*-jde-*- */
package app.alumnoe.cv.beans;

import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Idiomas que posee el alumno o egresado a partir la institución educativa
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class Idioma {

    /**
     * El identificador del idioma
     */
    private int nIdIdioma;
    /**
     * El identificador del CV
     */
    private int nIdCV;
    /**
     * El Idioma
     */
    private String sIdioma;
    /**
     * Si el idioma únicamente es de comprensión lectora por parte del alumno
     */
    private boolean comprensionLectura;
    /**
     * El nivel que se tiene de dicho idioma
     */
    private String sNivel;
    /**
     * La institución educativa donde se adquirió el conocimiento
     */
    private String sInstitucionEducativa;

    /**
     * El constructor para el idioma
     *
     * @param nIdIdioma El identificador del idioma
     * @param nIdCV El identificador para el CV
     * @param sIdioma La cadena del Idioma
     * @param comprensionLectura Si el idioma que se tiene es unicamente en
     * nivel de comprensión lectora
     * @param sNivel El nivel
     * @param sInstitucionEducativa La institución educativa donde se adquirió
     * el idioma
     */
    public Idioma(int nIdIdioma, int nIdCV, String sIdioma, boolean comprensionLectura, String sNivel, String sInstitucionEducativa) {
        this.nIdIdioma = nIdIdioma;
        this.nIdCV = nIdCV;
        this.sIdioma = sIdioma;
        this.comprensionLectura = comprensionLectura;
        this.sNivel = sNivel;
        this.sInstitucionEducativa = sInstitucionEducativa;
    }

    @Override
    public String toString() {
        return "Idioma{" + "nIdIdioma=" + getnIdIdioma() + ", nIdCV=" + getnIdCV() + ", sIdioma=" + getsIdioma() + ", comprensionLectura=" + isComprensionLectura() + ", sNivel=" + getsNivel() + ", sInstitucionEducativa=" + getsInstitucionEducativa() + '}';
    }

    /**
     * @return the nIdIdioma
     */
    public int getnIdIdioma() {
        return nIdIdioma;
    }

    /**
     * @return the nIdCV
     */
    public int getnIdCV() {
        return nIdCV;
    }

    /**
     * @return the sIdioma
     */
    public String getsIdioma() {
        return sIdioma;
    }

    /**
     * @param sIdioma the sIdioma to set
     */
    public void setsIdioma(String sIdioma) {
        this.sIdioma = sIdioma;
    }

    /**
     * @return the comprensionLectura
     */
    public boolean isComprensionLectura() {
        return comprensionLectura;
    }

    /**
     * @param comprensionLectura the comprensionLectura to set
     */
    public void setComprensionLectura(boolean comprensionLectura) {
        this.comprensionLectura = comprensionLectura;
    }

    /**
     * @return the sNivel
     */
    public String getsNivel() {
        return sNivel;
    }

    /**
     * @param sNivel the sNivel to set
     */
    public void setsNivel(String sNivel) {
        this.sNivel = sNivel;
    }

    /**
     * @return the sInstitucionEducativa
     */
    public String getsInstitucionEducativa() {
        return sInstitucionEducativa;
    }

    /**
     * @param sInstitucionEducativa the sInstitucionEducativa to set
     */
    public void setsInstitucionEducativa(String sInstitucionEducativa) {
        this.sInstitucionEducativa = sInstitucionEducativa;
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException {

        try {

            Conexion con = new Conexion();
            String query = "select ";
            if (nIdIdioma == -1) {
                query += "addIdioma(" + nIdCV;
                query += ", '" + sIdioma + "'";
                query += ", '" + comprensionLectura + "'";
                query += ", '" + sNivel + "'";
                query += ", '" + sInstitucionEducativa + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    ResultSet r = con.exec(query);
                    while (r.next()) {
                        int resultado = r.getInt("addIdioma");
                        this.nIdIdioma = resultado;
                    }
                }

            } else {

                query += "updateIdioma(" + nIdIdioma;
                query += ", '" + sIdioma + "'";
                query += ", '" + comprensionLectura + "'";
                query += ", '" + sNivel + "'";
                query += ", '" + sInstitucionEducativa + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }
            }
            con.close();

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Formacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo guardar el elemento: Idioma");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Idioma");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {
            Conexion con = new Conexion();
            String query = "select deleteIdioma( " + nIdIdioma + " );";
            con.exec(query);
            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Formacion");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {


        //nuevo
        Idioma f = new Idioma(-1, 1, "portugues", true, "poco", "cele");
        f.save();

        //f.delete();


        System.out.println(f);
    }
}
